/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package helpers;

import com.tida.servir.entities.*;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author ale
 */
public class Helpers {
    public static List<Perfil> getPerfilesSinAsignarPorUsuario(long usuarioId, Session session) {
        Query query = session.getNamedQuery("callSpPerfilSinAsignarPorUsuario");
        query.setParameter("in_usuario_id", usuarioId);
        return query.list();
    }
    public static List<Menu> getOpcionesDelMenu(long inPerfilId, Session session) {
        Query query = session.getNamedQuery("callSpMenuSinAsignarPorPerfil");
        query.setParameter("in_perfil_id", inPerfilId);
        return query.list();
    }

    public static LkEstadoUsuario getEstadoUsuario(int estadoId, Session session) {
        Query query = session.getNamedQuery("LkEstadoUsuario.findById");
        query.setParameter("id", estadoId);
        return (LkEstadoUsuario) query.list().get(0);
    }

    public static List<LkEstadoUsuario> getEstadoUsuario(Session session) {
        Query query = session.getNamedQuery("LkEstadoUsuario.findAll");
        return query.list();
    }

    public static List<Rol> getRolUSuario(long rolid, Session session) {
        Query query = session.getNamedQuery("Rol.findByIdLow");
        query.setParameter("id", rolid);
        return query.list();
    }

    public static List<DatoAuxiliar> getValoresTablaAuxiliar(String tabla, Session session) {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", tabla));
        return c.list();
    }

    public static List<String> getValorTablaAuxiliar(String tabla, Session session) {
        // TODO: este codigo esta duplicado
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", tabla));
        c.setProjection(Projections.property("id"));
        c.setProjection(Projections.property("valor"));
        return c.list();
    }

    public static List<String> getValorTablaAuxiliar(String tabla, Session session, String tablaRelacion, long relacionCodigo) {
        // TODO: este codigo esta duplicado
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", tabla));
        c.add(Restrictions.eq("tablaRelacion", tablaRelacion));
        c.add(Restrictions.eq("relacionCodigo", relacionCodigo));
        c.setProjection(Projections.property("valor"));
        return c.list();
    }

    public static boolean validateDate(Date testDate) {

        try {
            GregorianCalendar gc = new GregorianCalendar();
            gc.setLenient(false);        // must do this
            gc.set(GregorianCalendar.YEAR, testDate.getYear());
            gc.set(GregorianCalendar.MONTH, testDate.getMonth());// invalid month
            gc.set(GregorianCalendar.DATE, testDate.getDate());

            gc.getTime(); // exception thrown here
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * Obtiene las tablas en forma de objeto de tablas auxiliares.
     *
     * @param tabla
     * @param tablaRelacion
     * @param relacionCodigo
     * @return
     */
    public static List<DatoAuxiliar> getDatoAuxiliarLista(String tabla, Long codigo, Session session) {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.like("nombreTabla", tabla));
        c.add(Restrictions.like("codigo", codigo));
        if (c.list().isEmpty()) {
            return null;
        }
        return c.list();
    }
    
    public static List<DatoAuxiliar> getDatoAuxiliar(String tabla, String tablaRelacion, long relacionCodigo, Session session) {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.like("nombreTabla", tabla));
        if (tablaRelacion != null) {
            if (!tablaRelacion.equals("")) {
                c.add(Restrictions.like("tablaRelacion", tablaRelacion));
                c.add(Restrictions.eq("relacionCodigo", relacionCodigo));
            }
        }
        c.addOrder( Order.asc("valor") );
        return c.list();
    }

       
    /**
     * Obtiene el dato auxiliar de la tabla y códigos dados
     *
     * @param tabla
     * @param codigo
     * @param session
     * @return
     */
    public static DatoAuxiliar getDatoAuxiliar(String tabla, Long codigo, Session session) {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.like("nombreTabla", tabla));
        c.add(Restrictions.like("codigo", codigo));

        if (c.list().isEmpty()) {
            return null;
        }

        return (DatoAuxiliar) c.list().get(0);
    }

    /**
     * Obtiene un dato auxiliar segun tabla y valor
     *
     * @param tabla
     * @param valor
     * @param session
     * @return
     */
    public static DatoAuxiliar getDatoAuxiliar(String tabla, String valor, Session session) {
        List<DatoAuxiliar> ld;
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.like("nombreTabla", tabla));
        c.add(Restrictions.like("valor", valor));
        ld = c.list();
        if (ld.size() > 0) {
            return (DatoAuxiliar) c.list().get(0);
        } else {
            return null;
        }
    }

    /**
     * Calcula si es válido o no un agrupamiento de datos auxiliares de ubigeo
     *
     * @param depto - El valor del departamento. UBDepartamento
     * @param prov - El valor de la provincia. UBProvincia
     * @param dist - El valor del distrito. UBDistrito
     */
    public static Boolean isUbigeoValido(DatoAuxiliar depto, DatoAuxiliar prov, DatoAuxiliar dist, Session session) {
        if (dist == null) {
            if (prov == null) {
                return true;
            } else {
                if (depto == null) {
                    return false; // prov no nulo y depto nulo.
                }
                return (prov.getRelacionCodigo() == depto.getCodigo());

            }
        } else {
            if (prov == null) {
                return false;
            }
            if (dist == null) {
                return false;
            }

        }
        return (dist.getRelacionCodigo() == prov.getCodigo()) && (prov.getRelacionCodigo() == depto.getCodigo());
    }

    
    /**
     * Obtiene las tablas en forma de objeto de tablas auxiliares.
     *
     * @param tabla
     * @param tablaRelacion
     * @param relacionCodigo
     * @param flg_altatrabajador
     * @return
     */
    public static List<DatoAuxiliar> getDatoAuxiliar_td(String tabla, String tablaRelacion, long relacionCodigo, Session session ) {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.like("nombreTabla", tabla));
        c.add(Restrictions.like("flg_altatrabajador", true));
//        if (tablaRelacion != null) {
//            if (!tablaRelacion.equals("")) {
//                c.add(Restrictions.like("tablaRelacion", tablaRelacion));
//                c.add(Restrictions.eq("relacionCodigo", relacionCodigo));
//
//            }
//        }
        c.addOrder( Order.asc("valor") );
        return c.list();
    }
    
}